// msi/MSI1110.js
// MSI-1110 条码编码器（Modified Plessey + Mod 11 + Mod 10 校验）
// 先添加 Mod 11 校验位，再对“原始数据 + Mod11”结果添加 Mod 10 校验位

import MSI from './MSI.js';
import { mod11, mod10 } from './checksums.js';

/**
 * MSI-1110 条码类（Mod 11 + Mod 10 双重校验）
 *
 * 编码规则：
 * 1. 第一个校验位 = mod11(原始数据)
 * 2. 第二个校验位 = mod10(原始数据 + 第一个校验位)
 * 3. 最终编码数据 = 原始数据 + 第一个校验位 + 第二个校验位
 *
 * 示例：
 *   输入: '12345'
 *   第一次 Mod 11: mod11('12345') = 2
 *   第二次 Mod 10: mod10('123452') = 8
 *   实际编码数据: '1234528'
 *
 * 优势：
 * - 结合 Mod 11（高权重）和 Mod 10（Luhn）的优点
 * - 错误检测能力极强，适合高可靠性系统
 */
class MSI1110 extends MSI {
  /**
   * 构造函数
   * @param {string} data - 原始数字字符串（不含校验位）
   * @param {Object} options - 条码配置项
   */
  constructor(data, options) {
    if (!/^[0-9]+$/.test(data)) {
      throw new Error('MSI1110: 输入必须为纯数字');
    }

    const mod11Check = mod11(data);
    const mod10Check = mod10(data + mod11Check);

    const encodedData = data + mod11Check + mod10Check;

    super(encodedData, options);

    // 保留关键信息
    this.originalData = data;
    this.mod11Checksum = mod11Check;
    this.mod10Checksum = mod10Check;
  }

  /**
   * 验证原始输入是否为纯数字
   * @returns {boolean}
   */
  valid() {
    return /^[0-9]+$/.test(this.originalData);
  }

  /**
   * 获取 Mod 11 校验位
   * @returns {number} 0–10
   */
  getMod11Checksum() {
    return this.mod11Checksum;
  }

  /**
   * 获取 Mod 10 校验位
   * @returns {number} 0–9
   */
  getMod10Checksum() {
    return this.mod10Checksum;
  }

  /**
   * 获取完整校验字符串（两位）
   * @returns {string}
   */
  getChecksumString() {
    return `${this.mod11Checksum}${this.mod10Checksum}`;
  }
}

export default MSI1110;